/**
 * Tree控件
 * @example 示例:
tree = new FDTree({
	domId:'menu'
	,data:rows
	,onclick:function(node) {
		document.getElementById('d').innerHTML = (node.text);
		if(node.url) {
			window.open(node.url)
		}
	}
});
 * @param options 参见{@link #getOptions}返回的对象
 * @constructor
 * @author thc 
 * 2013-3-28
 */
var FDTree = function(options) {
	FDLib.implement(this,FDControl);
	
	this.options = FDLib.util.apply(this.getOptions(),options);
	
	var view = this.options.view;
	this.treeView = new view(this.options);
	
	this.reload();
}

FDTree.prototype = {
/**
 * <code>
// 渲染控件的domId
domId:null
// 服务器请求路径
,url:''
// 后台请求参数
,params:{}
// 点击节点事件.点击任何节点都会触发
,onclick:function(node){}
// 点击checkbox触发的事件
,onchecked:function(node,checkbox){}
// 节点数据,数组形式
,data:null
// 默认的视图层
,view:FDTreeView
// 后台传递值的字段名
,valueFieldName:'id'
// 后台传递数据显示值的字段名
,textFieldName:'text'
// 后台传递数据子元素的属性名
,childrenFieldName:'children'
// 是否显示checkbox
,isShowCheckbox:false
// 任何情况下点击"+/-"展开/收缩
// true时点击节点即可展开/收缩
// 默认为false
,clickToggle:false
 * </code>
 */
	getOptions:function() {
		return {
			domId:null
			,url:''
			// 后台请求参数
			,params:{}
			// 点击节点事件.点击任何节点都会触发
			,onclick:function(node){}
			// 
			,onchecked:function(node,checkbox){}
			// 节点数据,数组形式
			,data:null
			,view:FDTreeView
			,valueFieldName:'id'
			,textFieldName:'text'
			,childrenFieldName:'children'
			// 是否显示checkbox
			,isShowCheckbox:false
			// 任何情况下点击"+/-"展开/收缩
			// true时点击节点即可展开/收缩
			// 默认为false
			,clickToggle:false
		}
	}
	/**
	 * 模拟选中节点
	 */
	,clickNode:function(id) {
		this.treeView.clickNode(id);
	}
	/**
	 * 勾选某个节点,参数为数组,数组元素为节点id
	 * @param idArr 数组,元素为节点id
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj,checkbox)<br>
	 * 	nodeObj为节点对象,checkbox为<input>对象
	 */
	,select:function(idArr,callback) {
		var that = this;
		FDLib.util.each(idArr,function(id){
			that.treeView.select(id,callback);
		})
	}
	/**
	 * 不勾选,与select()方法相反
	 * @param idArr 数组,元素为节点id
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj,checkbox)<br>
	 * 	nodeObj为节点对象,checkbox为<input>对象
	 */
	,unselect:function(idArr,callback) {
		var that = this;
		FDLib.util.each(idArr,function(id){
			that.treeView.unselect(id,callback);
		})
	}
	/**
	 * 勾选所有节点
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj,checkbox)<br>
	 * 	nodeObj为节点对象,checkbox为<input>对象
	 */
	,selectAll:function(callback) {
		this.treeView.selectAll(callback);
	}
	/**
	 * 取消勾选所有节点
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj,checkbox)<br>
	 * 	nodeObj为节点对象,checkbox为<input>对象
	 */
	,unselectAll:function(callback) {
		this.treeView.unselectAll(callback);
	}
	/**
	 * 反选
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj,checkbox)<br>
	 * 	nodeObj为节点对象,checkbox为<input>对象
	 */
	,selectOthers:function(callback) {
		this.treeView.selectOthers(callback);
	}
	/**
	 * 获取所有勾选中的值,返回数组
	 * @return 返回数组,数组元素中的值为valueFieldName对应的值
	 */
	,getSelectedValue:function() {
		var that = this;
		var value = this._doGetValue(function(checkbox){
			return true;
		});
		
		return value;
	}
	/**
	 * 获取勾选的值,返回数组元素<br>
	 * <b>注:</b>这个方法返回的值不包含父节点的值,要获取所有的值使用getSelectedValue()
	 * 
	 * @return 返回数组,数组元素中的值为valueFieldName对应的值
	 */
	,getSelectedValueIngoreRoot:function() {
		var that = this;
		return this._doGetValue(function(checkbox){
			return !that._isRootNode(checkbox.parentNode);
		});
	}
	/**
	 * 设置数据
	 * @param data 数组形式
	 */
	,setData:function(data) {
		if(FDLib.util.isObject(data)) {
			this.options.data = data;
			this.reload();
		}
	}
	// filter是个函数,返回一个布尔值
	,_doGetValue:function(filter) {
		var value = [];
		var selectedCheckboxes = this.treeView.getSelectedCheckboxes();
		FDLib.util.each(selectedCheckboxes,function(checkbox){
			if(filter(checkbox)) {
				value.push(checkbox.value);
			}
		});
		
		return value;
	}
	/**
	 * 全部展开
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj)<br>
	 * 	nodeObj为节点对象
	 */
	,expandAll:function(callback) {
		this.treeView.expandAll(callback);
	}
	/**
	 * 全部收缩
	 * @param callback 回调函数,该回调函数有两个参数callback(nodeObj)<br>
	 * 	nodeObj为节点对象
	 */
	,collapseAll:function(callback) {
		this.treeView.collapseAll(callback);
	}
	/**
	 * 重新加载
	 * @param params 服务器请求参数
	 */
	,reload:function(params) {
		this._loadData(params);
		
		this.treeView.refresh(this.options.data);
	}
	,_loadData:function(params) {
		
		var opt = this.options;
		opt.params = params;
		if(opt.url) {
			FDLib.ajax.request({
				url:opt.url
				,params:opt.params
				,success:function(data) {
					opt.data = JSON.parse(data);
				}
			});
		}
		
	}
	/**
	 * 隐藏
	 */
	,hide:function() {
		this.treeView.hide();
	}
	/**
	 * 显示
	 */
	,show:function() {
		this.treeView.show();
	}
	// 判断是否是父节点
	,_isRootNode:function(span) {
		return span.getAttribute('isroot');
	}
}
